package examples.codequality.web;

import com.fasterxml.jackson.databind.JsonNode;
import examples.codequality.app.UserCreateCmdExe;
import examples.codequality.app.UserGetQryExe;
import examples.codequality.domain.User;
import jakarta.annotation.Resource;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.request.async.DeferredResult;

/**
 * 控制器类，用于处理用户相关的 HTTP 请求
 * 提供方法来获取用户信息和保存新用户
 *
 * @author baigod
 */
@RestController // 标识该类为Spring MVC控制器
public class UserController {

    @Resource // 自动注入 UserGetQryExe 组件
    private UserGetQryExe userGetQryExe;

    @Resource // 自动注入 UserCreateCmdExe 组件
    private UserCreateCmdExe userCreateCmdExe;

    /**
     * 获取用户信息的接口
     *
     * @param id 用户 ID
     * @return DeferredResult<ResponseEntity < User>> 包含用户信息的响应
     */
    @GetMapping("/get") // 映射 GET 请求到 "/get" 路径
    public DeferredResult<ResponseEntity<User>> get(String id) {
        // 创建一个 DeferredResult，超时时间为 100 毫秒
        final DeferredResult<ResponseEntity<User>> response = new DeferredResult<>(100L);

        // 调用 UserGetQryExe 的 execute 方法，传入用户 ID 和 DeferredResult
        userGetQryExe.execute(id, response);

        // 返回 DeferredResult，客户将基于此接收异步响应
        return response;
    }

    /**
     * 保存用户信息的接口
     *
     * @param body 包含用户信息的请求体
     * @return DeferredResult<ResponseEntity < User>> 包含用户信息的响应
     */
    @PostMapping("/save") // 映射 POST 请求到 "/save" 路径
    public DeferredResult<ResponseEntity<User>> save(@RequestBody JsonNode body) {
        // 创建一个 DeferredResult，超时时间为 100 毫秒
        final DeferredResult<ResponseEntity<User>> response = new DeferredResult<>(100L);

        // 从请求体中获取用户名，并调用 UserCreateCmdExe 的 execute 方法
        userCreateCmdExe.execute(body.get("username").asText(), response);

        // 返回 DeferredResult，客户将基于此接收异步响应
        return response;
    }
}